package com.atguigu.srb.core.task;


import com.atguigu.srb.base.consts.SrbMqConst;
import com.atguigu.srb.base.dto.SmsDTO;
import com.atguigu.srb.core.pojo.entity.LendReturn;
import com.atguigu.srb.core.pojo.entity.UserInfo;
import com.atguigu.srb.core.service.LendReturnService;
import com.atguigu.srb.core.service.UserInfoService;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.joda.time.DateTime;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;

//定时任务
@Component
public class SrbTask {

    @Resource
    LendReturnService lendReturnService;
    @Resource
    UserInfoService userInfoService;
    @Resource
    RabbitTemplate rabbitTemplate;

    //每天早上八点  轮循判断如果有用户需要还款 发送还款通知
    //cron表达式： springtask支持6位的表达式
    // 完整的cron表达式有7位： 秒、分、时、日、月、周、年  xxxljob的关系系统直接可以选择配置生成
    @Scheduled(cron = "0 0 8 * * ?")
    public void returnAmountTask(){
//        System.out.println("任务执行时间："+ new Date());

        //查询需要通知的还款列表
        List<LendReturn> lendReturns = lendReturnService.list(Wrappers.lambdaQuery(LendReturn.class)
                .eq(LendReturn::getStatus, 0)
                //如果用户还款日期小于等于 今天+1  提前一天通知
                .le(LendReturn::getReturnDate, new DateTime()
                        .plusDays(1).toString("yyyy-MM-dd")));

        //如果以上集合位空结束定时任务
        if (CollectionUtils.isEmpty(lendReturns)){
            return;
        }
        //遍历为每个用户发消息通知还款
        lendReturns.forEach(lendReturn -> {
            UserInfo userInfo = userInfoService.getById(lendReturn.getUserId());
            SmsDTO smsDTO = new SmsDTO();
            smsDTO.setMobile(userInfo.getMobile());
            smsDTO.setType(5);
            smsDTO.setParams(Arrays.asList("hq"));
            rabbitTemplate.convertAndSend(SrbMqConst.SMS_EXCHANGE,
                    SrbMqConst.SMS_ROUTING_KEY,smsDTO);
        });
    }

}
